﻿using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Npgsql;
using NpgsqlTypes;
using System.Windows.Forms;



/**
 * Clase para manejar los usuarios. 
*/

public class Usuario : Persona
{
    private String usuario;
    private String contrasena;   
    private String estado;
     
    /*
     * Constructor de Usuario
     */    
    public Usuario()
    {
             
    }

    /**
     * Inserta un usario nuevo en la base de datos     
     */
    public void GuardarUsuario()
    {
        
        AbrirConexion();      
        IniciarTransaccion();        
        try
        {
            
            SentenciaSQL = "select count(*) from usuario where usuario = '" + NombreUsuario + "';";
            DataTable tb = EjecutarComandoDataSet().Tables[0]; //tabla que contiene el count de usuarios con nombre NombreUsuario
            int cant = Convert.ToInt32(tb.Rows[0]["count"].ToString());
            if (cant == 1) {
                throw new UsuarioException("el nombre de usuario ya existe, elija otro"); //si el usuario y existe creamos una excepcion
            }

            GuardarSinTransaccion(); //para que todo se incluya en la transaccion actual                        
            SentenciaSQL = "insert into usuario (id_usuario, usuario, contrasena, estado)values(" + Id + ",'" + NombreUsuario + "','" + Contrasena + "', '" + Estado + "');";
            EjecutarComando();
            ConfirmarTransaccion();
            PermisoUsuario p = new PermisoUsuario(this);
            p.Inicializar();
        }
        catch(ConexionException ex)
        {
            CancelarTransaccion();
            throw new ConexionException("ocurrio un error al guardar el usuario", ex);
        }      
        catch(UsuarioException ex)
        {
            CancelarTransaccion();
            throw new UsuarioException(ex.Message);
        }
        finally
        {
            CerrarConexion();
        }
        
        
    }

    public void Actualizar() {
        AbrirConexion();
        IniciarTransaccion();
        try
        {
            ActualizarSinTransaccion();
            SentenciaSQL = "update usuario set usuario = '" + NombreUsuario + "', contrasena = '"+ Contrasena +"', estado = '"+Estado+"' where id_usuario = "+ Id +";";
            EjecutarComando();
            ConfirmarTransaccion();
        }
        catch (ConexionException ex)
        {
            CancelarTransaccion();
            throw new ConexionException("ocurrio un error al internar modificiar el usuario", ex);
        }
        finally {
            CerrarConexion();
        }
     
    }

    /**
     * Busca los usuarios que coinciden con los parametros de busqueda
     * @param usuario nombre de usuario
     * @param nombre nombre real del usuario
     * @param nroDocumento numero de documento del usuario
     * @returm dataset con el resultado de la busqueda
     */
    public DataSet Buscar(String usuario, String nombre, String nroDocumento)
    {
        DataSet ds = new DataSet();

        SentenciaSQL = "select * from usuario, persona where estado <> 'b' and usuario like '%" + usuario + "%' and id_persona = id_usuario and nombre like '%" + nombre + "%' and nro_documento like '%" + nroDocumento + "%'";
        AbrirConexion();
        IniciarTransaccion();
        try
        {
            ds = EjecutarComandoDataSet();
            ConfirmarTransaccion();
        }
        catch(Exception ex)
        {
            CancelarTransaccion();
            throw new ConexionException("no se pudieron obtener los datos del usuario", ex);
        }
        finally
        {
            CerrarConexion();
        }
        
        return ds;
        
    }

    /**
     * Borra un Usuario
     * Cambia el estado del usuario a 'b' -> borrado
     */
    public void Borrar() {
        SentenciaSQL = "update usuario set estado = 'b' where id_usuario = " + Id + " ;";
        
        AbrirConexion();
        IniciarTransaccion();
        try
        {
            EjecutarComando();
            ConfirmarTransaccion();
        }
        catch (Exception ex)
        {
            CancelarTransaccion();
            throw new ConexionException("no se pudo eliminar el usuario", ex);
        }
        finally
        {
            CerrarConexion();
        }
    }

  

    /// Getters y Setters     

    public String NombreUsuario
    {
        get { return this.usuario; }
        set { this.usuario = value; }
    }

    public String Contrasena
    {
        get { return this.contrasena; }
        set { this.contrasena = value; }
    }
    

    public String Estado {
        get { return this.estado; }
        set { this.estado = value; }
    }



  
    
   

}
